

"""
1，将一个列表中所有元素转换成浮点类型，如果不能转换，则丢弃该元素。
"""

class Practice0807:

    def __init__(self  , *args):
        self.num_list = args[0]

    def convert_float(self):
       # pass
        result = []
        for tmp in self.num_list:
            try:
                f_num = float(tmp)
                result.append(f_num)
            except TypeError:
                print(f'TypeError异常：{tmp}必须为数值类型')
            except ValueError:
                print(f'ValueError异常：{tmp}必须为数值类型')
            except:  # 可以捕获所有类型的错误
                print(f'{tmp}转换发生其它异常')
        print(f'result={result}')
        return result

    def convert_float2(self):
        result = []
        #使用迭代器
        it1 = iter(self.num_list)
        tempStr = 0
        while True:
            try:
                tempStr = next(it1)
                temp = float(tempStr)
                result.append(temp)
            except(ValueError, TypeError):
                print(f'ValueError异常：{tempStr}必须为数值类型')
            except StopIteration:
                break
        print(f'result={result}')
        return result


    def convert_float3(self):
        # for循环变量列表，前面是一个三元表达式 ，如果元素是int、floag类型 或者 替换小数点后 是数字 就直接通过float函数转换，否则 为None
        result = [float(item) if isinstance(item, (int, float)) or (item.replace('.', '', 1).isdigit()) else None for item in self.num_list]
        #再次变量列表 如果排查元素为None
        result =  [num for num in result if num is not None]
        print(f'result={result}')
        return result

    def convert_float4(self):

        result = []
        #如果在遍历集合的时候 进行删除 可能导致遍历过程中元素缺失，最好副本进行遍历（如：切片[:]、copy）
        list_tmp = self.num_list[:] #切片，从到结尾 复制所有切片
        for i in list_tmp:
            try:
                result.append(float(i))
            except:
                list_tmp.remove(i)
        print('原始num_list=' , self.num_list)
        print(f'result={result}')
        return result



arry = [1.2 , '1.23' , 'a' , 5.60 , 'b' , 0 , 123.34 , '99.2' , 1]
obj = Practice0807(arry)
obj.convert_float()
obj.convert_float2()
obj.convert_float3()
obj.convert_float4()